{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 导入必要的工具包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import warnings\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取特征工程后的数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv(\"FE_day.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>yr</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant  season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  \\\n",
       "0        1         1         0         0         0       1       0       0   \n",
       "1        2         1         0         0         0       1       0       0   \n",
       "2        3         1         0         0         0       1       0       0   \n",
       "3        4         1         0         0         0       1       0       0   \n",
       "4        5         1         0         0         0       1       0       0   \n",
       "\n",
       "   mnth_4  mnth_5  ...   weekday_5  weekday_6      temp     atemp       hum  \\\n",
       "0       0       0  ...           0          1  0.355170  0.373517  0.828620   \n",
       "1       0       0  ...           0          0  0.379232  0.360541  0.715771   \n",
       "2       0       0  ...           0          0  0.171000  0.144830  0.449638   \n",
       "3       0       0  ...           0          0  0.175530  0.174649  0.607131   \n",
       "4       0       0  ...           0          0  0.209120  0.197158  0.449313   \n",
       "\n",
       "   windspeed  holiday  workingday  yr   cnt  \n",
       "0   0.284606        0           0   0   985  \n",
       "1   0.466215        0           0   0   801  \n",
       "2   0.465740        0           1   0  1349  \n",
       "3   0.284297        0           1   0  1562  \n",
       "4   0.339143        0           1   0  1600  \n",
       "\n",
       "[5 rows x 35 columns]"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(731, 35)"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据准备"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 从原始数据中分离输入特征X和输出y\n",
    "y = data['cnt']\n",
    "X = data.drop('cnt',axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 对全体数据，随机选择其中80%做训练数据，剩下20%为测试数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666, test_size=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(584, 34) (147, 34)\n"
     ]
    }
   ],
   "source": [
    "print(X_train.shape, X_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 最小二乘线性回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression\n",
    "# 1.使用默认配置初始化学习器实例\n",
    "lr = LinearRegression()\n",
    "\n",
    "# 2.用训练数据训练模型参数\n",
    "lr.fit(X_train, y_train)\n",
    "\n",
    "# 3. 用训练好的模型对测试集进行预测\n",
    "y_test_pred_lr = lr.predict(X_test)\n",
    "y_train_pred_lr = lr.predict(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>yr</td>\n",
       "      <td>4549.136402</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>temp</td>\n",
       "      <td>2707.682487</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>mnth_9</td>\n",
       "      <td>1160.174124</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>atemp</td>\n",
       "      <td>934.351609</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>mnth_10</td>\n",
       "      <td>931.733359</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>weathersit_1</td>\n",
       "      <td>799.605197</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>mnth_12</td>\n",
       "      <td>772.941496</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>season_4</td>\n",
       "      <td>738.438403</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>mnth_11</td>\n",
       "      <td>548.637073</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>weathersit_2</td>\n",
       "      <td>305.260698</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>mnth_8</td>\n",
       "      <td>297.994160</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>workingday</td>\n",
       "      <td>218.604212</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>weekday_6</td>\n",
       "      <td>199.112550</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>weekday_5</td>\n",
       "      <td>124.568266</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>season_2</td>\n",
       "      <td>110.400044</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>season_3</td>\n",
       "      <td>101.446644</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>mnth_6</td>\n",
       "      <td>68.420351</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>mnth_5</td>\n",
       "      <td>37.369007</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>weekday_4</td>\n",
       "      <td>17.272060</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>weekday_3</td>\n",
       "      <td>-6.322377</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>instant</td>\n",
       "      <td>-6.971132</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>weekday_2</td>\n",
       "      <td>-57.090077</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>weekday_0</td>\n",
       "      <td>-124.586626</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>weekday_1</td>\n",
       "      <td>-152.953796</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>holiday</td>\n",
       "      <td>-293.130136</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>mnth_7</td>\n",
       "      <td>-376.266654</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>mnth_4</td>\n",
       "      <td>-454.993618</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>mnth_3</td>\n",
       "      <td>-606.211203</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>season_1</td>\n",
       "      <td>-950.285090</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>mnth_2</td>\n",
       "      <td>-1026.132943</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>weathersit_3</td>\n",
       "      <td>-1104.865895</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-1245.444147</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>mnth_1</td>\n",
       "      <td>-1353.665152</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>hum</td>\n",
       "      <td>-1583.508532</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         columns         coef\n",
       "33            yr  4549.136402\n",
       "27          temp  2707.682487\n",
       "13        mnth_9  1160.174124\n",
       "28         atemp   934.351609\n",
       "14       mnth_10   931.733359\n",
       "17  weathersit_1   799.605197\n",
       "16       mnth_12   772.941496\n",
       "4       season_4   738.438403\n",
       "15       mnth_11   548.637073\n",
       "18  weathersit_2   305.260698\n",
       "12        mnth_8   297.994160\n",
       "32    workingday   218.604212\n",
       "26     weekday_6   199.112550\n",
       "25     weekday_5   124.568266\n",
       "2       season_2   110.400044\n",
       "3       season_3   101.446644\n",
       "10        mnth_6    68.420351\n",
       "9         mnth_5    37.369007\n",
       "24     weekday_4    17.272060\n",
       "23     weekday_3    -6.322377\n",
       "0        instant    -6.971132\n",
       "22     weekday_2   -57.090077\n",
       "20     weekday_0  -124.586626\n",
       "21     weekday_1  -152.953796\n",
       "31       holiday  -293.130136\n",
       "11        mnth_7  -376.266654\n",
       "8         mnth_4  -454.993618\n",
       "7         mnth_3  -606.211203\n",
       "1       season_1  -950.285090\n",
       "6         mnth_2 -1026.132943\n",
       "19  weathersit_3 -1104.865895\n",
       "30     windspeed -1245.444147\n",
       "5         mnth_1 -1353.665152\n",
       "29           hum -1583.508532"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "feat_names = X.columns\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef\":list((lr.coef_.T))})\n",
    "fs.sort_values(by=['coef'],ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 岭回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha is: 1.0\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import RidgeCV\n",
    "\n",
    "#1. 设置超参数（正则参数）范围\n",
    "alphas = [0.01, 0.1, 1, 10, 100]\n",
    "\n",
    "#2. 生成一个RidgeCV实例\n",
    "ridge = RidgeCV(alphas=alphas, store_cv_values=True)  \n",
    "\n",
    "#3. 模型训练\n",
    "ridge.fit(X_train, y_train)    \n",
    "\n",
    "#4. 预测\n",
    "y_test_pred_ridge = ridge.predict(X_test)\n",
    "y_train_pred_ridge = ridge.predict(X_train)\n",
    "\n",
    "#可视化最佳参数\n",
    "mse_mean = np.mean(ridge.cv_values_, axis = 0)\n",
    "plt.plot(np.log10(alphas), mse_mean.reshape(len(alphas),1))\n",
    "\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()\n",
    "\n",
    "print ('alpha is:', ridge.alpha_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef_lr</th>\n",
       "      <th>coef_ridge</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>yr</td>\n",
       "      <td>4549.136402</td>\n",
       "      <td>1544.674723</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>temp</td>\n",
       "      <td>2707.682487</td>\n",
       "      <td>1765.881620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>mnth_9</td>\n",
       "      <td>1160.174124</td>\n",
       "      <td>574.895356</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>atemp</td>\n",
       "      <td>934.351609</td>\n",
       "      <td>1527.867002</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>mnth_10</td>\n",
       "      <td>931.733359</td>\n",
       "      <td>58.155429</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>weathersit_1</td>\n",
       "      <td>799.605197</td>\n",
       "      <td>805.001535</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>mnth_12</td>\n",
       "      <td>772.941496</td>\n",
       "      <td>-675.761308</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>season_4</td>\n",
       "      <td>738.438403</td>\n",
       "      <td>709.837923</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>mnth_11</td>\n",
       "      <td>548.637073</td>\n",
       "      <td>-610.471057</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>weathersit_2</td>\n",
       "      <td>305.260698</td>\n",
       "      <td>283.485003</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>mnth_8</td>\n",
       "      <td>297.994160</td>\n",
       "      <td>36.319840</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>workingday</td>\n",
       "      <td>218.604212</td>\n",
       "      <td>209.455573</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>weekday_6</td>\n",
       "      <td>199.112550</td>\n",
       "      <td>182.578689</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>weekday_5</td>\n",
       "      <td>124.568266</td>\n",
       "      <td>124.306939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>season_2</td>\n",
       "      <td>110.400044</td>\n",
       "      <td>124.005754</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>season_3</td>\n",
       "      <td>101.446644</td>\n",
       "      <td>106.470624</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>mnth_6</td>\n",
       "      <td>68.420351</td>\n",
       "      <td>282.879825</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>mnth_5</td>\n",
       "      <td>37.369007</td>\n",
       "      <td>430.570732</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>weekday_4</td>\n",
       "      <td>17.272060</td>\n",
       "      <td>29.079490</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>weekday_3</td>\n",
       "      <td>-6.322377</td>\n",
       "      <td>3.072918</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>instant</td>\n",
       "      <td>-6.971132</td>\n",
       "      <td>1.272780</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>weekday_2</td>\n",
       "      <td>-57.090077</td>\n",
       "      <td>-50.509294</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>weekday_0</td>\n",
       "      <td>-124.586626</td>\n",
       "      <td>-132.906082</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>weekday_1</td>\n",
       "      <td>-152.953796</td>\n",
       "      <td>-155.622660</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>holiday</td>\n",
       "      <td>-293.130136</td>\n",
       "      <td>-259.128180</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>mnth_7</td>\n",
       "      <td>-376.266654</td>\n",
       "      <td>-368.511624</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>mnth_4</td>\n",
       "      <td>-454.993618</td>\n",
       "      <td>145.732564</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>mnth_3</td>\n",
       "      <td>-606.211203</td>\n",
       "      <td>216.712947</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>season_1</td>\n",
       "      <td>-950.285090</td>\n",
       "      <td>-940.314301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>mnth_2</td>\n",
       "      <td>-1026.132943</td>\n",
       "      <td>7.414244</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>weathersit_3</td>\n",
       "      <td>-1104.865895</td>\n",
       "      <td>-1088.486537</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-1245.444147</td>\n",
       "      <td>-1096.277524</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>mnth_1</td>\n",
       "      <td>-1353.665152</td>\n",
       "      <td>-97.936948</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>hum</td>\n",
       "      <td>-1583.508532</td>\n",
       "      <td>-1353.554908</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         columns      coef_lr   coef_ridge\n",
       "33            yr  4549.136402  1544.674723\n",
       "27          temp  2707.682487  1765.881620\n",
       "13        mnth_9  1160.174124   574.895356\n",
       "28         atemp   934.351609  1527.867002\n",
       "14       mnth_10   931.733359    58.155429\n",
       "17  weathersit_1   799.605197   805.001535\n",
       "16       mnth_12   772.941496  -675.761308\n",
       "4       season_4   738.438403   709.837923\n",
       "15       mnth_11   548.637073  -610.471057\n",
       "18  weathersit_2   305.260698   283.485003\n",
       "12        mnth_8   297.994160    36.319840\n",
       "32    workingday   218.604212   209.455573\n",
       "26     weekday_6   199.112550   182.578689\n",
       "25     weekday_5   124.568266   124.306939\n",
       "2       season_2   110.400044   124.005754\n",
       "3       season_3   101.446644   106.470624\n",
       "10        mnth_6    68.420351   282.879825\n",
       "9         mnth_5    37.369007   430.570732\n",
       "24     weekday_4    17.272060    29.079490\n",
       "23     weekday_3    -6.322377     3.072918\n",
       "0        instant    -6.971132     1.272780\n",
       "22     weekday_2   -57.090077   -50.509294\n",
       "20     weekday_0  -124.586626  -132.906082\n",
       "21     weekday_1  -152.953796  -155.622660\n",
       "31       holiday  -293.130136  -259.128180\n",
       "11        mnth_7  -376.266654  -368.511624\n",
       "8         mnth_4  -454.993618   145.732564\n",
       "7         mnth_3  -606.211203   216.712947\n",
       "1       season_1  -950.285090  -940.314301\n",
       "6         mnth_2 -1026.132943     7.414244\n",
       "19  weathersit_3 -1104.865895 -1088.486537\n",
       "30     windspeed -1245.444147 -1096.277524\n",
       "5         mnth_1 -1353.665152   -97.936948\n",
       "29           hum -1583.508532 -1353.554908"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef_lr\":list((lr.coef_.T)), \"coef_ridge\":list((ridge.coef_.T))})\n",
    "fs.sort_values(by=['coef_lr'],ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Lasso模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "alpha is: 1.0\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LassoCV\n",
    "\n",
    "#1. 设置超参数搜索范围\n",
    "alphas = [0.01, 0.1, 1, 10, 100]\n",
    "\n",
    "#2. 生成学习器实例\n",
    "lasso = LassoCV(alphas=alphas)\n",
    "\n",
    "#1. 设置超参数搜索范围\n",
    "#Lasso可以自动确定最大的alpha，所以另一种设置alpha的方式是设置最小的alpha值（eps） 和 超参数的数目（n_alphas），\n",
    "#然后LassoCV对最小值和最大值之间在log域上均匀取值n_alphas个\n",
    "# np.logspace(np.log10(alpha_max * eps), np.log10(alpha_max),num=n_alphas)[::-1]\n",
    "\n",
    "#2 生成LassoCV实例（默认超参数搜索范围）\n",
    "# lasso = LassoCV()  \n",
    "\n",
    "#3. 训练（内含CV）\n",
    "lasso.fit(X_train, y_train)\n",
    "\n",
    "#4. 预测\n",
    "y_test_pred_lasso = lasso.predict(X_test)\n",
    "y_train_pred_lasso = lasso.predict(X_train)\n",
    "\n",
    "# 可视化最佳参数\n",
    "mses = np.mean(lasso.mse_path_, axis = 1)\n",
    "plt.plot(np.log10(lasso.alphas_), mses)\n",
    "plt.xlabel('log(alpha)')\n",
    "plt.ylabel('mse')\n",
    "plt.show()    \n",
    "            \n",
    "print ('alpha is:', lasso.alpha_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>columns</th>\n",
       "      <th>coef_lr</th>\n",
       "      <th>coef_ridge</th>\n",
       "      <th>coef_lasso</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>33</th>\n",
       "      <td>yr</td>\n",
       "      <td>4549.136402</td>\n",
       "      <td>1544.674723</td>\n",
       "      <td>2358.983279</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>temp</td>\n",
       "      <td>2707.682487</td>\n",
       "      <td>1765.881620</td>\n",
       "      <td>2679.387928</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>mnth_9</td>\n",
       "      <td>1160.174124</td>\n",
       "      <td>574.895356</td>\n",
       "      <td>678.656820</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>atemp</td>\n",
       "      <td>934.351609</td>\n",
       "      <td>1527.867002</td>\n",
       "      <td>958.344787</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>mnth_10</td>\n",
       "      <td>931.733359</td>\n",
       "      <td>58.155429</td>\n",
       "      <td>300.831829</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>weathersit_1</td>\n",
       "      <td>799.605197</td>\n",
       "      <td>805.001535</td>\n",
       "      <td>491.389395</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>mnth_12</td>\n",
       "      <td>772.941496</td>\n",
       "      <td>-675.761308</td>\n",
       "      <td>-199.455594</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>season_4</td>\n",
       "      <td>738.438403</td>\n",
       "      <td>709.837923</td>\n",
       "      <td>589.169118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>mnth_11</td>\n",
       "      <td>548.637073</td>\n",
       "      <td>-610.471057</td>\n",
       "      <td>-237.341769</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>weathersit_2</td>\n",
       "      <td>305.260698</td>\n",
       "      <td>283.485003</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>mnth_8</td>\n",
       "      <td>297.994160</td>\n",
       "      <td>36.319840</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>workingday</td>\n",
       "      <td>218.604212</td>\n",
       "      <td>209.455573</td>\n",
       "      <td>29.619139</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>weekday_6</td>\n",
       "      <td>199.112550</td>\n",
       "      <td>182.578689</td>\n",
       "      <td>5.587847</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>weekday_5</td>\n",
       "      <td>124.568266</td>\n",
       "      <td>124.306939</td>\n",
       "      <td>119.027988</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>season_2</td>\n",
       "      <td>110.400044</td>\n",
       "      <td>124.005754</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>season_3</td>\n",
       "      <td>101.446644</td>\n",
       "      <td>106.470624</td>\n",
       "      <td>-0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>mnth_6</td>\n",
       "      <td>68.420351</td>\n",
       "      <td>282.879825</td>\n",
       "      <td>142.391356</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>mnth_5</td>\n",
       "      <td>37.369007</td>\n",
       "      <td>430.570732</td>\n",
       "      <td>285.254004</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>weekday_4</td>\n",
       "      <td>17.272060</td>\n",
       "      <td>29.079490</td>\n",
       "      <td>16.348289</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>weekday_3</td>\n",
       "      <td>-6.322377</td>\n",
       "      <td>3.072918</td>\n",
       "      <td>-0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>instant</td>\n",
       "      <td>-6.971132</td>\n",
       "      <td>1.272780</td>\n",
       "      <td>-0.979553</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>weekday_2</td>\n",
       "      <td>-57.090077</td>\n",
       "      <td>-50.509294</td>\n",
       "      <td>-43.600211</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>weekday_0</td>\n",
       "      <td>-124.586626</td>\n",
       "      <td>-132.906082</td>\n",
       "      <td>-296.556177</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>weekday_1</td>\n",
       "      <td>-152.953796</td>\n",
       "      <td>-155.622660</td>\n",
       "      <td>-145.593965</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>holiday</td>\n",
       "      <td>-293.130136</td>\n",
       "      <td>-259.128180</td>\n",
       "      <td>-446.739087</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>mnth_7</td>\n",
       "      <td>-376.266654</td>\n",
       "      <td>-368.511624</td>\n",
       "      <td>-474.662905</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>mnth_4</td>\n",
       "      <td>-454.993618</td>\n",
       "      <td>145.732564</td>\n",
       "      <td>-0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>mnth_3</td>\n",
       "      <td>-606.211203</td>\n",
       "      <td>216.712947</td>\n",
       "      <td>36.405604</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>season_1</td>\n",
       "      <td>-950.285090</td>\n",
       "      <td>-940.314301</td>\n",
       "      <td>-1103.645379</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>mnth_2</td>\n",
       "      <td>-1026.132943</td>\n",
       "      <td>7.414244</td>\n",
       "      <td>-161.523299</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>weathersit_3</td>\n",
       "      <td>-1104.865895</td>\n",
       "      <td>-1088.486537</td>\n",
       "      <td>-1387.164198</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>windspeed</td>\n",
       "      <td>-1245.444147</td>\n",
       "      <td>-1096.277524</td>\n",
       "      <td>-1185.336890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>mnth_1</td>\n",
       "      <td>-1353.665152</td>\n",
       "      <td>-97.936948</td>\n",
       "      <td>-314.313624</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>hum</td>\n",
       "      <td>-1583.508532</td>\n",
       "      <td>-1353.554908</td>\n",
       "      <td>-1524.147901</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         columns      coef_lr   coef_ridge   coef_lasso\n",
       "33            yr  4549.136402  1544.674723  2358.983279\n",
       "27          temp  2707.682487  1765.881620  2679.387928\n",
       "13        mnth_9  1160.174124   574.895356   678.656820\n",
       "28         atemp   934.351609  1527.867002   958.344787\n",
       "14       mnth_10   931.733359    58.155429   300.831829\n",
       "17  weathersit_1   799.605197   805.001535   491.389395\n",
       "16       mnth_12   772.941496  -675.761308  -199.455594\n",
       "4       season_4   738.438403   709.837923   589.169118\n",
       "15       mnth_11   548.637073  -610.471057  -237.341769\n",
       "18  weathersit_2   305.260698   283.485003     0.000000\n",
       "12        mnth_8   297.994160    36.319840     0.000000\n",
       "32    workingday   218.604212   209.455573    29.619139\n",
       "26     weekday_6   199.112550   182.578689     5.587847\n",
       "25     weekday_5   124.568266   124.306939   119.027988\n",
       "2       season_2   110.400044   124.005754     0.000000\n",
       "3       season_3   101.446644   106.470624    -0.000000\n",
       "10        mnth_6    68.420351   282.879825   142.391356\n",
       "9         mnth_5    37.369007   430.570732   285.254004\n",
       "24     weekday_4    17.272060    29.079490    16.348289\n",
       "23     weekday_3    -6.322377     3.072918    -0.000000\n",
       "0        instant    -6.971132     1.272780    -0.979553\n",
       "22     weekday_2   -57.090077   -50.509294   -43.600211\n",
       "20     weekday_0  -124.586626  -132.906082  -296.556177\n",
       "21     weekday_1  -152.953796  -155.622660  -145.593965\n",
       "31       holiday  -293.130136  -259.128180  -446.739087\n",
       "11        mnth_7  -376.266654  -368.511624  -474.662905\n",
       "8         mnth_4  -454.993618   145.732564    -0.000000\n",
       "7         mnth_3  -606.211203   216.712947    36.405604\n",
       "1       season_1  -950.285090  -940.314301 -1103.645379\n",
       "6         mnth_2 -1026.132943     7.414244  -161.523299\n",
       "19  weathersit_3 -1104.865895 -1088.486537 -1387.164198\n",
       "30     windspeed -1245.444147 -1096.277524 -1185.336890\n",
       "5         mnth_1 -1353.665152   -97.936948  -314.313624\n",
       "29           hum -1583.508532 -1353.554908 -1524.147901"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 看看各特征的权重系数，系数的绝对值大小可视为该特征的重要性\n",
    "fs = pd.DataFrame({\"columns\":list(feat_names), \"coef_lr\":list((lr.coef_.T)), \"coef_ridge\":list((ridge.coef_.T)), \"coef_lasso\":list((lasso.coef_.T))})\n",
    "fs.sort_values(by=['coef_lr'],ascending=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 就各特征系数对三个模型分析：<br>\n",
    "* 从比较结果可明显看出L2正则(岭回归)使得线性回归系数收缩；而L1正则(Lasso)也会收缩回归系数，当正则参数取合适值时，L1正则使得有些回归系数为0，得到稀疏模型。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 再利用网格搜索交叉验证试试搜寻最优超参数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 岭回归模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.linear_model import Ridge\n",
    "param_grid = {'alpha':[0.01, 0.1, 1, 10, 100]}\n",
    "grid_search = GridSearchCV(Ridge(), param_grid, cv=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=Ridge(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=None,\n",
       "   normalize=False, random_state=None, solver='auto', tol=0.001),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'alpha': [0.01, 0.1, 1, 10, 100]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_search.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'alpha': 1}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Lasso模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import Lasso\n",
    "grid_search = GridSearchCV(Lasso(), param_grid, cv=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=Lasso(alpha=1.0, copy_X=True, fit_intercept=True, max_iter=1000,\n",
       "   normalize=False, positive=False, precompute=False, random_state=None,\n",
       "   selection='cyclic', tol=0.0001, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'alpha': [0.01, 0.1, 1, 10, 100]},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "grid_search.fit(X_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'alpha': 1}\n"
     ]
    }
   ],
   "source": [
    "print(grid_search.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型评价(RMSE和r2_score)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.metrics import mean_squared_error\n",
    "from sklearn.metrics import r2_score"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 最小二乘法模型评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test_err: 767.5194219703998\n",
      "train_err: 753.9986331255436\n"
     ]
    }
   ],
   "source": [
    "# 分别计算训练集和测试集上的RMSE(RMSE=MSE**0.5)\n",
    "train_err = mean_squared_error(y_train, y_train_pred_lr)**0.5\n",
    "test_err = mean_squared_error(y_test, y_test_pred_lr)**0.5\n",
    "\n",
    "print(\"test_err:\",test_err)\n",
    "print(\"train_err:\",train_err)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test_err: 0.8393985346561049\n",
      "train_err: 0.8488577427293332\n"
     ]
    }
   ],
   "source": [
    "# 分别计算训练集和测试集上的r2_score\n",
    "train_err = r2_score(y_train, y_train_pred_lr)\n",
    "test_err = r2_score(y_test, y_test_pred_lr)\n",
    "\n",
    "print(\"test_err:\",test_err)\n",
    "print(\"train_err:\",train_err)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 岭回归模型评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE of RidgeCV on test is 770.2419740581888\n",
      "The RMSE of RidgeCV on train is 758.8247755198348\n"
     ]
    }
   ],
   "source": [
    "# 评估，使用RMSE评价模型在测试集和训练集上的性能\n",
    "print('The RMSE of RidgeCV on test is', mean_squared_error(y_test, y_test_pred_ridge)**0.5)\n",
    "print('The RMSE of RidgeCV on train is', mean_squared_error(y_train, y_train_pred_ridge)**0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2_score of RidgeCV on test is 0.8382571398104951\n",
      "The r2_score of RidgeCV on train is 0.846916708677534\n"
     ]
    }
   ],
   "source": [
    "# 评估，使用r2_score评价模型在测试集和训练集上的性能\n",
    "print('The r2_score of RidgeCV on test is', r2_score(y_test, y_test_pred_ridge))\n",
    "print('The r2_score of RidgeCV on train is', r2_score(y_train, y_train_pred_ridge))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Lasso模型评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The RMSE of LassoCV on test is 771.990627074346\n",
      "The RMSE of LassoCV on train is 756.1414520771983\n"
     ]
    }
   ],
   "source": [
    "# 评估，使用RMSE评价模型在测试集和训练集上的性能\n",
    "print('The RMSE of LassoCV on test is', mean_squared_error(y_test, y_test_pred_lasso)**0.5)\n",
    "print('The RMSE of LassoCV on train is', mean_squared_error(y_train, y_train_pred_lasso)**0.5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The r2_score of LassoCV on test is 0.8375219080216967\n",
      "The r2_score of LassoCV on train is 0.8479974475264037\n"
     ]
    }
   ],
   "source": [
    "# 评估，使用r2_score评价模型在测试集和训练集上的性能\n",
    "print('The r2_score of LassoCV on test is', r2_score(y_test, y_test_pred_lasso))\n",
    "print('The r2_score of LassoCV on train is', r2_score(y_train, y_train_pred_lasso))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 我们可以画出学习曲线直观看看是否过拟合"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import cross_validation\n",
    "from sklearn.learning_curve import learning_curve\n",
    "\n",
    "def plot_learning_curve(estimator, title, X, y, ylim=None, cv=None,\n",
    "                        n_jobs=1, train_sizes=np.linspace(.1, 1.0, 5)):\n",
    "    \n",
    "    plt.figure()\n",
    "    plt.title(title)\n",
    "    if ylim is not None:\n",
    "        plt.ylim(*ylim)\n",
    "    plt.xlabel(\"Training examples\")\n",
    "    plt.ylabel(\"Score\")\n",
    "    train_sizes, train_scores, test_scores = learning_curve(\n",
    "        estimator, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes)\n",
    "    train_scores_mean = np.mean(train_scores, axis=1)\n",
    "    train_scores_std = np.std(train_scores, axis=1)\n",
    "    test_scores_mean = np.mean(test_scores, axis=1)\n",
    "    test_scores_std = np.std(test_scores, axis=1)\n",
    "    plt.grid()\n",
    "\n",
    "    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,\n",
    "                     train_scores_mean + train_scores_std, alpha=0.1,\n",
    "                     color=\"r\")\n",
    "    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,\n",
    "                     test_scores_mean + test_scores_std, alpha=0.1, color=\"g\")\n",
    "    plt.plot(train_sizes, train_scores_mean, 'o-', color=\"r\",\n",
    "             label=\"Training score\")\n",
    "    plt.plot(train_sizes, test_scores_mean, 'o-', color=\"g\",\n",
    "             label=\"Cross-validation score\")\n",
    "\n",
    "    plt.legend(loc=\"best\")\n",
    "    return plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<module 'matplotlib.pyplot' from '/Applications/anaconda3/lib/python3.6/site-packages/matplotlib/pyplot.py'>"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEWCAYAAACJ0YulAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xl8FPX9+PHXe3dzJ4Q73MQDrZyKgGhR8ca7gBYRr1ZF/aq/etSK2qq10mptFa1WxbuWgopgrfWoVzzqwaHcSsEDRRAUuZJNstf798fMbjabzUHIZnO8nz7W3Zn5zMxnP0s+75nPZ+YzoqoYY4wxAJ50Z8AYY0zLYUHBGGNMjAUFY4wxMRYUjDHGxFhQMMYYE2NBwRhjTIwFBdNgIvKSiJyb7ny0JCIyUEQWNSDdoSKyujny1BaJSKmI7NkE25knIuOaIk9tlQWFVkBEvhSRo9OdD1U9XlWfSMW2RaSDiMwQka/cCmCtO901FftrQr8D/hSdqO23UtV3VHXfZs1ZVZ7OE5GwW647RGSpiJyUjrw0lqrmq+rnTbCp24DpTbCdNsuCggFARHxp3Hcm8DowCBgHdAAOAbYAoxqxvWb5LiLSEzgCeK459tcYcWXxvqrmAx2BvwJzRKRjCvfXIqnqAqCDiIxId15aKgsKrZyInCQiS0Rkm4i8JyJD45ZNE5HPRGSniKwSkfFxy84Tkf+KyF0i8gNwszvvXRH5k4hsFZEvROT4uHVKROSCuPXrSruHiLzt7vs1EblPRP5ey9c4B+gHjFfVVaoaUdXNqvo7VX3R3Z6KyN5x239cRG51P48VkfUicq2IfAs8JiKfxB8Ni4hPRL4XkeHu9Gi3vLa5R85jE8rmczfvX4jIlFryfQzwkapWNOB3Gisi6+OmvxSRX4rIMhHZLiJPiUh23PIm+13j86GqEeBJIA8YELdeXeVR628pIsXub3O+iHwFvNHY8hWRvUXkLbc8vheRp+LWif3+IlIoIn8Tke9EZJ2I/FpEPHHbrvXfpasEOLG+36zdUlV7tfAX8CVwdJL5w4HNwEGAFzjXTZvlLj8d6IUT/CcBZUBPd9l5QAi4HPABOe68IHChu71LgA2AuOuUABfErV9X2vdxmlUygTHADuDvtXy/OcAT9ZSBAnvHTT8O3Op+Hut+l9uBLPe73AjMikt/IvCp+7k3zlnICW7ZHONOd8OpLHcA+7ppewKDasnTHcB9DfytxgLrE9ItcH+fzsAnwMUp/F3fdZd7gUuBANC9vvKo77cEit3f5m9u2eU0tnyB2cAN7jrZwJhkv7+7r38CBe7+/wec35B/l26aq4B56f67bqkvO1No3S4EHlTVD1U1rE57fyUwGkBVn1HVDeoceT8FrKF6c8wGVf2LqoZUtdydt05VH1LVMPAEzh9tUS37T5pWRPoBI4EbVTWgqu8Cz9fxPboAGxtVAlUiwE2qWul+l38Ap4hIrrv8THcewFnAi6r6ols2rwKLcCqx6LYGi0iOqm5U1ZW17LMjsHM38nyP+/v8APwL2N+dn4rfdbSIbAMqcCr4s1R1c33lsQu/5c2qWubur7HlGwT6A71UtcLdVzUi4sUJhNep6k5V/RL4M3B2XLL6/g3vxPntTBIWFFq3/sDV7in6NvePvi/OUSQick5cE8Q2YDAQ33H7dZJtfhv9oKp+92N+LfuvLW0v4Ie4ebXtK2oLzh/u7vhO45pxVHUtztH3yW5gOIWqoNAfOD2h3MbgHG2X4VQ6FwMbReTfIvKjWva5FedotbG+jfvsp6qcU/G7fqCqHYFOOJX6oXHLai0PGv5bxs9rbPn+ChBggYisFJGfJ9lPV5wzlnVx89bhnJ1E1fdvuADYlmTbBgsKrd3XwHRV7Rj3ylXV2SLSH3gIuAzo4lYIK3D+6KJSNUTuRqBz3FE6OJVabV4DjhORvDrS+IH47fVIWJ7su8wGJgOnAqvcQAFOuT2ZUG55qnobgKq+oqrH4FSKn+KUYzLLgH3qyHNjpex3VdVS4P+As0XkgLj91VYeDf0t4/fZqPJV1W9V9UJV7QVcBPxV4vqRXN9TdUYR1Q/4prbvnMR+wNJdSN+uWFBoPTJEJDvu5cP5Y7pYRA4SR56InCgiBThttwp8ByAiP8M5okw5VV2H01xws4hkisjBwMl1rPIkTkXyrIj8SEQ8ItJFRK4XkWiTwxLgTBHxinOd+eENyMoc4FicduV/xM3/O84ZxHHu9rLF6QjuIyJFInKKG6AqgVIgXMv2XwWGS1wHsSvZb7UrUvq7quoW4GGcfheoozwa8VvWub26yldETheRPu42trrfs1rZu01CTwPTRaTADZJXuftsqMOBl3YhfbtiQaH1eBEoj3vdrKqLcNqf78X5I1qL09GGqq7CaWt9H9gEDAH+24z5nQIcjNM0dCvwFE4lUIOqVgJH4xw1vorTEbkAp6ngQzfZL3Aqo23utuu9DFRVN+J8/0Pc/Ufnf41z9nA9TuX6NXANzt+DB7gap3PyB5wK5P9q2f4mnKttTk1YVOO3qi+vCdttjt91Bk6fwdB6ygN24bd089jY8h0JfCgipThNXL9Q1S+S7OJynM71z4F3cQL+ow350iIyEihT59JUk0T0ShFjUsq9vPBTVb0p3XlpSiIyEKczc5S2kz+m1vxbisizwCPqXupsarKgYFLCPSL7AfgCpwnnOeBgVf04rRkzu8x+y/alRd99aFq1HsA8nMtN1wOXWCXSatlv2Y7YmYIxxpiYlHU0i8ijIrJZRFbUslxE5B5xBj5bJu7wA8YYY9Inlc1Hj+NcPfG3WpYfjzP2ygCc2/nvd9/r1LVrVy0uLm6aHLYgZWVl5OXVdZm+sTKqm5VP3dp7+SxevPh7Ve1WX7qUBQVVfVtEiutIcirwN/eKjQ9EpKOI9HQvI6xVcXExixbVO3x9q1NSUsLYsWPTnY0WzcqoblY+dWvv5SMi6+pPld77FHpT/db49VS/Vd0YY0wzS+fVR5JkXtJebxGZCkwFKCoqoqSkJIXZSo/S0tI2+b2akpVR3ax86mbl0zDpDArrqT6GSh+cuxxrUNWZwEyAESNGaFs8BWzvp7YNYWVUNyufuln5NEw6m4+eB85xr0IaDWyvrz/BGGNMaqXsTEFEZuM8WKSrOE+cugnIAFDVB3DGhzkBZ1wXP/CzVOXFGGNMw6Ty6qPJ9SxXnCdAGWOMaSFslFRjjDExFhSMMcbEWFAwxhgTY0HBGGNMTPsICrNmQXExeDzQty88+igEAmAjxBpjTDVt/3kKs2bB1Kng9zvT69fDpZfCDz/AKadAVhbk5kJODmRkOC9P+4iVxhiTqO0HhRtuqAoIURUVcNddMHkyhEKwYwds3Vq1PDPTCRS5uRYojDHtStsPCl99lXz+hg1w7LEwaBAMHuy8Bg6EDh2cQLFzJ2zbVpU+I6PqjCIz05n2epvnOxhjTDNp+0GhXz9Yl2TE2IICKCqCkhJ45pmq+f37Vw8UgwY56SIRKCuD7dur+iIyMpwgkZtbFSh8bb9IjTFtV9uvwaZPr96nAE5F/vvfw4QJzvTmzbBiRdVr5Up48cWq9F27Vj+bGDwY9tjDCQ7l5c5ZRZTPZ4HCGNNqtf3aasoU5/2GG5ympJ494cor4bjjoLLSqbS7d4cjj3ReUTt3wqpV1QPFgw9CMOgsz8urChDRM4t99nG2V1EBpaVVZxQeT1WgyMqqChSSbPRwY4xJn7YfFMAJDFOmOJV0KORU7IGAc/ZQUeHMU3Uqaa/XqbQLCuCgg5xXVGUlrFlTFSRWrICnn3aalcCp6PfZp2bzU3Z21f4iESdtYqBQrcqDMcakSfsIClEiVVcT5eZCx47O/HDYCRTBoNMc5Pc7R/rgVNRer1PhZ2ZWVfZRkQh8+WVVkFi5smY/RXFx1VlF9NWtmxOMfvjB2UYgAGvXOgEkN9d5j+bVAoUxppm0r6BQG6/XeWVnO2cI4ASDaKCoqHCCRXl51ZE+OIEiIwP23NN5nXxy1bJNm6oCRX39FIMGkZOV5QSOSMS56ikcrkpr91IYY5qJBYXaiDhnBpmZTv9BVGLzUzRYREXPKrp3d65aqqufYsUKeOABCIU4CJL3UwwY4KwbvZci2sQUvZci/hJZCxTGmN1kQWFX+XxVVxgVFjrzIpGazU9+f/WOZq/XqfRr6af49JVX+NHWrc4ZRUP6KTweu5fCGNPkLCg0BY/HaeLJyoL8fGdetPkpFHIq/uhZRbT5Kb5Te/BgvhXhR4MGOcui/RTRZqeG9lN06eIEkx07qjqu7V4KY8wusNohVeKbn3JzoVMnZ34o5LwCgepnFZGI07kdbX7aYw+nn+KUU6q2uYv9FAwa5Ny8F72XIv4Kq5wc58zFAoUxJo7VBM0t2vyUne0MqQFOQNiwAXr1qjqriAYKEefl8zlXLCXeT7FjB3zySdJ+CqB6P0U0WOy9t7OfsjK7l8IYU40FhZbA43Eq3/x859WlS/V7KoLBquan6M1z0SP+3Ny676eIvp5+Gh57zFmekeF0YMd3aO+3nxMEtmyB555zBgzcuNG52e+aa5y7v71eJ6+1vUSq3ut6WYe4MS2WBYWWKv6eCqjq1E68p6K8PPk9FdHKPipZP8WbbzrBIqq42NnPypVVZxobNsB11znTEydW7Sd6hhH9HD2raajEQBL/il4inBhwIhEnOMYHl9oCjzGmUSwotDb13VOR2Kkd7Ufw+ZzB/pL1U8Tfof3yy9XvkQDnPo1rrnFe0Q717Ozq74nz6lueleX0Z2RnO+/R6ejn+Olov0cw6DwPoyF3fscHmNrObKJl2ZAzm7oCzqxZVcOo9OvnjLcVHV7FmFbGgkJbkHhPRefOzvz4eyqindqJ91R07uz0URx1lDOvT5/a93PVVU7QqahwXtHP8e+lpdXnxX/enSfdeb0cGr2SKhpUcnJqBpzEz9HgUtt0tNziA1Z0efSu8sTLeuPPXp5/3jmTipbrunVw4YXOaLoTJ9Z95hKdX9fyuoJfYjNcOOzstyHr1hdUG7u8IevNmQM33ugE+D594He/gzPOqJ7nhr6bJmdBoS1ryD0V0WARrbB79nSajBL17g1XX934vETPZhIDSWJQqWP5hg0b6JufXzNtRYVzddX33ycPVIFA4/MN1QNKYvBZvrzm9svLnbOq//636mwk+vL5nMrc56t7ur70SZbnbdzo5CXZ8ujn6JlT9N+GCOr+9kpV0E6cp6gzTxWNq5Bjy6PLUFSqbyOWThXvv18i5+bpSEWFs+Drr9GLL6Z0w5cEThxX708Rnx+gKjBK9L36WZ6Kk0ZRQpXlbPpsWVVAia6b8K4izvY9cdtMfI/7rBpXcrH5idPV3zX6HRoQ3BQl95nn6PjbP+L9ZgOS4rNRCwrtTW33VETPKm66Ca64ovoZRXa2M7JstO8iXl1NOcn+IHw+Z7/Rpq9a/tCSzfts1Sr6Ru/l2BWRSPJgkSz4JFteWemUR7LltQQc9fvh1f9AKAzhkPvuvCTaX9PERjZiHXXPetTnRd1Aoj5vbB7euPnRzz6vs56v+jLn3V3PE5fW6wWvB/V6yX3h1aqA4JKKCnJ/fwehLz4DcfMkAohTuSZp0pNq/zac/6lHqq+HIALqETziofe2CjydcqqtUy2ARGdFa3SPp2r/4ASeaP5Ini88krBd3G27y6LziG7b48z3eJ1pjxc84gRe97fJ/u+HFM78G57ov7V165zHAUBKAoMFBVO9U3vqVKcJKtpG3rdv1el9fOdy4nuyedEb9eLf4zumGzIvur1IpOpejmSBqCH9DNHvGA2GtZVFwlFgWMNEUMIaIYISioQIapigBul29Kn4Nm6qsZlQzyK+ePWZapWKqiIIqhEkomg4jCccRsJhCIURjTgBJOjMk3DEfYXj3t304QgSXScUxhOOsHHjNnp1yatKE3LTR5y0hKu2S+K23PSEQ7HlsQAWtw6hULX8RAOeBEJx67v7jkScg41w2Nl/JILHX16jrAA8pWV0fOwf7iG0Ous2sa5NvsXmM2sI3HAUfFUI/bbD9Nf9TLnhBgsKpplEhxpvadavd4b82NXglGSeRiJOZR8JE46EiWiYUDBAMBIiGK4kEA4SDgcIaRhwApaiSMSp2D0KHmDblRfT+cbb8cQd/Uaysyi9/CLyg9E58X0pEdxI4by8GeAFMpN9YaWqHSJBNNC4QSwMfLd+K937dq5anvSMK7aBtLTPdx97Ik91+TahgoNJW3qwueTfNVeIPzhI8hLVWCBxXpGE6WgaZfWXm9i3Xzd3vpsGNwAlrANuGvcAJbYf4g5g4tchLk30oIbqeRNViGjVNuJfkUjCd4nE8vnyvVcw9WTwu/9G1nWEqScD/1pHKv5KLSiY1qeOyix2ZK9KOBImTJiwhgmEA4Qiodh7WMOxI/doRSk+p5nBI9l4PXlkiods8dTYR7zAxVN5OOsLpn81i6/zw/Qt9XJDv0mc9LOL4jNV9V5f0EpcXtv86JlT9DOAd7tz30rico24lREQjlTfRuy9jgBUQ31p3eVJgtKjlxzClRXz8LtXWq/rCFNPgbKcQzipsrL6966xWa3xOb7XItYcg+KEbKqlCRQWEsnNjuVdNRI7+wtrhIiGCKsSUY19DitEUCLRtBqp+vdFmEhsXnRb1ac1flnsjDMc21b8diNC1TKUCM6yu08U/JnVy8WfCTcc57WgYNqvaKdlIBxwKnt1jvAbVNkTrew9eD1esnxZeOqp7Btq3ifz+NXOZygvcC7j/aogzBU7nyHwyUgm7Oc+7rW5jsh9G5273uOEI+FYuQTDQcLqTMe/wpEIQbdcQ5EgoUiYUDhIKBIkHHHXi6UNudNO2mAkVLWPSMidDlWbDrnrByMh5stLsYAQ5c+AX+i/efqD76oqSaoq0sQKNPobRyvQquno56p08euFwiG3qnUOGOI71lu07OSzv8oPJ1+wmywomLSK/XFHwrGjsMTKPhgJEtEIlaFKvtz6pdPZpxqr6FNR2Tc0779/5/eUh6q3k5eHyvn1G79mU+kmgpFgrNKMvdSpSJMtC0fChDREKOykq7EsYTq2DQ1RGahEP9RqadNV8XnEg8/jwyteMrwZeMWLz+PDH0rep1ARrmRzcBte8eLxeGLvHvGR4fE603G/tVe8iAheiVvmrhdblrDe1k1bKepVVLWd+H0lmY7uy4P7Lp6k+0q6b/HWzKfHW23fXk/Cd/B4YvuKz8PRTx7Nhp01rwjsV9g/Jb+dBQWTEnVV9sFIkGA4GKvsY/VWLZV9ti879oeXn1VHJ3ETC0fCbCrbxDc7vmH9jvWs37me9TvWx6a/2fkN/qA/6brbK7dz6zu3VpuX4cnA6/HG3n0eHz7x4fM674nLotM+j49sX7aT3pM8rc/jY8d3O+jWs1u1bfo81bcf24YnYRviq32ZJ2FZQkUfn89o+tqC86iHRvHNzm9qzO9d0JuXz3p593+0OqxcuJJBIxtx9VqaXTfmOn716q+qHXzkZuQy/ajpKdmfBQWzS+qq7KNH9/GVvaLO5YMKItWbcXJ8Oc6yNAmEA2zYuaFaRR9f8W/YuYFgJFhtnY7ZHenToQ97ddqLw/ofxtxVc9leub3Gtnvl9+Ktn70Vq0Cb4wymNVR608ZMq1HB5fhymDZmWhpz1bJFmyH/8O4f2LhzI/0K+zH9qOlMGWL3KZhmoqpUhiupDFW2yso+qixQ5lT0bmUfq/jdSn9T2aZqzSuCUJRXRO8Ovdm/x/6ctM9J9O7Qmz4FfejTwXnlZeZV28f+PfZPWsldd+h15GbkNtt3bS2iFdxt797Ghp0b6FXQi2ljplX1v5ikJuw3geP3Pp4OWR3oltet/hV2gwUFg6oSCAeoCFVQGiilLOg89S2xg7alVPbg5HlrxdaqSj+uso8e7W+r2FZtnQxPBr0KetG7Q28OKz4sVtn37tCbPh360KugF5nepNeG1soquV03Yb8JrbJ8GnTndwOnY+snmR/bflyzKjjNmc0hpUFBRMYBd+Ncif2wqt6WsLwf8ATQ0U0zTVVfrLEh06QSg4A/6CeikVjnYF5GXtor/2Tt+cvXLsf/tT8WABI7eHMzcp0j+oI+HNDjgNjRffRov3ted7yepn88aWut5JpSXRVm/Py65tVXcSbdT0LFWTXbOZON3TDoXlZaGiitdZ16pwGPezezx73kNfp3Em0erO9dRIj9V8+60eXRO6xFhAxPwqVbKZCyoCAiXuA+4BhgPbBQRJ5X1VVxyX4NPK2q94vIQOBFoDhVeWqvokGgMlTJzsDOGkEgNyO32YNAZajSac9PaNaJduBu3LmxRnt+B18H+nfuz96d9+bw4sNjASBa8XfK7pTWYJZ4mWNDjizj58Wrr3J1J2LzRMSp9CrjhiKRqvWl6vrcWtePn7cr60NVZQk1K0yoWSnWNS9ZmoZWnMnmRac3eDfQv7B/rctrm078Lm1dKs8URgFrVfVzABGZA5wKxAcFBdzHj1EIJBmJzeyq+CBQGiylLFAWq1gyvBnNEgSSted/vePrWBPP5rLNNdvz84vo06EPw3sMp88+Vc06fTr0oXdBb75c+mXaO1Ljr/uPxA/FIMSuzIlKrMBq+5ysEqy2PMlRZXS9qt0L6z3r6VPYp9q8xLS1VXSJFeKurt8aCEKWLyvd2WjxUhkUegNfx02vBw5KSHMz8B8RuRzIA45OYX7aLFUlGAlSEaxokiAw75N5dbaR7257/uHFhzdJe36q1FXxZ3gyyPZlk+nNJMuXFQsEPo8v7ZWkRzzWuW12myQ7dW2SDYucDhynqhe402cDo1T18rg0V7l5+LOIHAw8AgxW1UjCtqYCUwGKiooOnDNnTkrynE6lpaXk1zVQW4LoUMbRuzajB90isluV0+ubX2fGmhlURipj87ziZUjBEHxeH5srNrOpclO15QDZnmyKsovontWdoqwiumdXf++c2Xm3L8usKKsgO6+W2zt3lXsFlUbHp4mSqiNzD55q5Rl/lNwS7eq/ofamvZfPEUccsVhVR9SXLpVB4WDgZlU9zp2+DkBV/xCXZiUwTlW/dqc/B0ar6ubatjtixAhdtGhRSvKcTiUlJYwdOzbpsuiZQGWoMnZ1UDgSRhB8Xh9Z3qwmO0qt7eYiDx4GdR9U7ei+udvzd/U6/IYc8Wf5ssj0ZraoI/7GquvfkLHyEZEGBYVUNh8tBAaIyB7AN8AZwJkJab4CjgIeF5H9cEb5+C6FeWoVokEgEA6ws3JnjSAQvcM3FZLdTg/OUXWq7zhtjF2t+KOVf2ut+I1JtZQFBVUNichlwCs4l5s+qqorReQWYJGqPg9cDTwkIlfinMSfp6k6dWnhFKU0UEppZSmlwVIiGkFVyfBmpDQIxNu4cyNej5dQpOZDYHoV9Er5/msTrfiTXV1jFb8xTSul9ym49xy8mDDvxrjPq4AfpzIPLVUwHKQyXBkLAtEhF6Lj3DTnwG4A67at44xnz8CDh0xvJoFw1RPFmmMYgvgj/uhZEVCt4vd5fPTq0MsqfmNSyO5obibRIFAWKKMsUEYwEkREqgWB/Mz0dIKt2bKGM+aeQUWognmT5vHFti9ScoduQyr+uo74V8vqtJWRMe2FBYUUqS0IeMUZ4jlbmugqmt20fNNyzpx3Jl7xMvenc9mv234c0POARgeB3a34jTHpZUGhiQTDTsdwWbCM0srSFhsE4i38ZiFnzz+bDlkdmHPaHPbstGeD1qut4o8/88n2ZZPhzbCK35hWxoJCI4UiISpDlbEgEH2gic/jI9ObSXZGywsC8d5e9zY//+fP6ZHfg6dOe4reHXrXSBN95oFV/Ma0HxYUGigaBPxBPzsrd8bG5WktQSDey2tf5pJ/X8JenfZi9sTZSYfiDUfCVIYq6ZbXzSp+Y9oRCwq1qBYEAjsJhoMIziP+WlsQiPfsqme58pUrGVo0lCfHP0mnnE5J05UFyuhV0IsO2R2SLjfGtE0WFFzR5wH7A352BHbUDAK+1hkE4v1t6d+4/vXrObjvwTx26mO1XslTEaogNzOXgqyCZs6hMSbd2m1QiA8COwNOc5BqXJ9AGwgC8e5feD+3vnMrR+1xFA+e9CA5GTlJ00VHWO1d0NuaiYxph9pVUKgMVbKzcmeNIJDhzWizQ+qqKne8dwd3f3g3p+x7CveMu4cMb+0P6vAH/XTN6dpmy8MYU7d2FRS2VWxjW8U2cjJy2kWlF9EIN5fczCMfP8LkwZO5/ejb63zyWCgSwiOeWvsZjDFtX7sKCkDsSpq2LhwJ86tXf8WclXO4YPgF3Hz4zfU2B/mDfnoX9E7JIyuNMa1D268d26FAOMDlL13OC/97gStHX8nVB19db0AoD5aTn5Fvw0gY085ZUGhjyoPlTH1hKm988Qa/Oew3XDzi4nrXUVVCkRB9C/ta57Ix7ZwFhTakNFDKec+dxwfrP+D2o2/nrKFnNWg9f9BPt7xuLeZxmMaY9LGg0EZsLd/K2fPPZtmmZfzl+L8wfr/xDVovGA7iFS8dszumOIfGmNbAgkIbsLlsM2c+eyafbf2Mh05+iOP2Pq7B65YHy+nXsV+zP7/BGNMyWVBo5b7Z8Q2T5k7i29JveeInT3BY/8MavG55sJzC7EJyM3JTmENjTGtiQaEV+3zr50yaO4nSQCmzT5vNyF4jG7xuRCOEI2G65nZNYQ6NMa2NBYVWatV3qzjz2TMJa5hnTn+Gwd0H79L6ZYEyuud1r/PuZmNM+2MNya3QRxs/4vSnT8fr8TJ/0vxdDgiBcIBMbyaF2YUpyqExprWyoNDKvPf1e5wx9wwKswuZP2k+e3fee5e3URGqoEd+D+tcNsbUYLVCK/L6569z9ryz6d2hN/MmzaNfYb9d3oY/6KdTdqdaR0k1xrRvFhRaiedXP8/Pn/85A7oM4NmfPkuP/B67vI1wJIyq0iW3SwpyaIxpCywotAJzVszh0hcvZXjP4Tx9+tN0zuncqO34g36653VvFwMCGmMax4JCC/fwRw9z9X+u5tB+h/KPCf+gQ1bjHo9ZGaok25fd6PWNMe2DBYUWSlWZ8cEMbiq5ieP3Pp7HTn2s0f0A0aepFeUX2YB3xpg6WTtCC6SqTH9nOvcvup+J+03kzuPu3K0mH3/QT+eczm3uEaPDrcOOAAAgAElEQVTGmKZnQaGFiWiE61+/nieXPcm5w87l1iNv3a1LR8ORMII0uh/CGNO+WFBoQUKREFe+fCXzPp3HpSMv5box1+12c48/6KdXQS97mpoxpkEsKLQQgUiAi/51ES9/9jLTxkzj8lGX7/Y2K0IV5Gbk2tPUjDENZkGhBfAH/dy48kY+2vYRtx5xKz874Ge7vU1VJRgO0rugt3UuG2MazIJCmm2v2M45z53Dkm1LuPO4O5k0aFKTbLcsUEaXnC5k+bKaZHvGmPbBgkIabfFv4cx5Z7L6+9Vc/6PrmywghCIhvB4vnXOtc9kYs2ssKKTJxp0bOePZM1i/fT2PnvooRd8XNdm2/QE/fQv72oB3xphdltJaQ0TGichqEVkrItNqSfNTEVklIitF5B+pzE9LsW7bOiY8PYFvS7/l7xP+zpF7HNlk2y4PllOQVUBeZl6TbdMY036k7ExBRLzAfcAxwHpgoYg8r6qr4tIMAK4DfqyqW0Wke6ry01L8b8v/mDx3MhXhCp467Sn277F/k207ohFCkRDd8ro12TaNMe1LKs8URgFrVfVzVQ0Ac4BTE9JcCNynqlsBVHVzCvOTdss3LWfi0xMJa5hnf/pskwYEqBrwLtOb2aTbNca0H6kMCr2Br+Om17vz4u0D7CMi/xWRD0RkXArzk1YLv1nI6c+cTo4vh3mT5vGjrj9q0u0Hw0F8Hp89Tc0Ys1tS2dGc7OJ4TbL/AcBYoA/wjogMVtVt1TYkMhWYClBUVERJSUmjMhSKhIhopNmv21+8dTE3r7qZblnduG2/2yhfW85KVlZLU1FWwcqFK2vZQv3CkTCZ3ky+kq92N7stVmlpaaN/+/bAyqduVj4Nk8qgsB7oGzfdB9iQJM0HqhoEvhCR1ThBYmF8IlWdCcwEGDFihI4dO7ZRGdpUuomyYFmzDgz30pqXuOm9m9ir817Mnji71vb+lQtXMmjkoEbtwx/0k5eRR8+CnruT1RavpKSExv727YGVT92sfBomlc1HC4EBIrKHiGQCZwDPJ6R5DjgCQES64jQnfZ7CPDWrZ1c9y0UvXMSgboOY+9O5KekAjmiESCRincvGmCaRsqCgqiHgMuAV4BPgaVVdKSK3iMgpbrJXgC0isgp4E7hGVbekKk/N6W9L/8YvXv4FB/U5iDmnzaFjdseU7KcsUEZRfpE9Tc0Y0yRSWpOo6ovAiwnzboz7rMBV7qvNuH/h/dz6zq0cvefRPHjSgylrrgqEA2R5s+xpasaYJmOHl01IVbnjvTu4+8O7OWXfU7hn3D1keDNStq+KYAXFnYptwDtjTJOxoNBEIhrh5pKbeeTjRzhz8JncdvRtKX2GQXmwnE45nexpasaYJmVBoQmEI2GuefUanlr5FBcOv5CbDr8ppUfv4UgYgC65XVK2D2NM+2RBYTcFwgEuf+lyXvjfC1w1+iquOviqlDfnlAXK6FXQyzqXjTFNrsG1ioiMAQao6mMi0g3IV9UvUpe1lq88WM7Uf03ljS/f4DeH/YaLR1yc8n1WhCrIzcylIKsg5fsyxrQ/DQoKInITMALYF3gMyAD+Dvw4dVlr2UoDpZz33Hl8sP4Dbj/6ds4aelbK96mqBMIBe5qaMSZlGnqmMB44APgIQFU3iEi7PVTdWr6Vs+efzbJNy7j3hHv5yY9+0iz79Qf9dM3pak9TM8akTEODQkBVVUQUQETa7WD9m8s2M3nuZL7Y9gUPn/Iwx+51bLPsNxQJ4REPnXI6Ncv+jDHtU0PvaH5aRB4EOorIhcBrwEOpy1bLtH7HesY/NZ5129fxxPgnmi0gQNWw2Km8zNUYYxp0pqCqfxKRY4AdOP0KN6rqqynNWQvz2dbPOGPuGZQGSpl92mxG9hrZbPsuD5ZTkFlgncvGmJSrNyi4T1B7RVWPBtpVIIha9d0qJj87GVXlmdOfYXD3wc22b1W1p6kZY5pNvc1HqhoG/CLSLp/e8tHGjzjt6dPweXzMmzSvWQMCQFmwjG553expasaYZtHQjuYKYLmIvAqURWeq6v9LSa5aiPe+fo/znjuPrrldeeq0p+hb2Lf+lZpQMBzEJ76UjbBqjDGJGhoU/u2+2o3XPn+Ni/51Ef069mP2xNn0yO/R7HkoD5bTr2M/PJLKx14YY0yVhnY0P+E+KGcfd9Zq92lpbdLzq5/n8pcuZ2C3gcyaMIvOOZ2bPQ/lwXIKswvJzcht9n0bY9qvht7RPBZ4AvgS59nLfUXkXFV9O3VZS485K+ZwzavXMKLXCJ74yRNpeVZBRCOEI2G65nZt9n0bY9q3hjYf/Rk4VlVXA4jIPsBs4MBUZSwdHv7oYW4quYnD+x/OI6c8Qk5GTlryURYoo3te95Q9i8EYY2rT0KCQEQ0IAKr6PxFpMzWWqnL3h3dzx3t3cMLeJ3DvCfembSiJQDhApjfTOpeNMWnR0KCwSEQeAZ50p6cAi1OTpealqtz69q08sPgBTht4Gn8+9s9pHZK6IlRB/8L+NuCdMSYtGlr7XQJcCvw/nD6Ft4G/pipTzSWiEa57/Tr+vuzvnDvsXG498ta0XunjD/jplN0pbc1WxhjT0KDgA+5W1Tshdpdzqx6qMxgOctUrVzHv03lcNvIypo2Zlt6jcwVF7Wlqxpi0auhh8etA/OFrDs6geK1SRaiCi164iHmfzmPamGlcd+h1aW+uiWiEorwie5qaMSatGloDZatqaXRCVUtFpNVcQD9r+SxueP0Gvtr+FT3ye9AhswOrf1jNrUfcys8O+Fm6s0dlqBIRsQHvjDFp19CgUCYiw1X1IwARGQGUpy5bTWfW8llM/ddU/EE/ABtLN7KRjUwZMqVFBITo09QyvBlpP1sxxpiGBoUrgGdEZAOgQC9gUspy1YRueP2GWECIV/JlSfNnJgl/0E/nnM5sZGO6s2KMMXX3KYjISBHpoaoLgR8BTwEh4GXgi2bI3277avtXSedv2LmhmXNSUygSQpC0DKNhjDHJ1NfR/CAQcD8fDFwP3AdsBWamMF9Npl9hv6TzexX0auac1OQP+inKL7KnqRljWoz6goJXVX9wP08CZqrqs6r6G2Dv1GataUw/anqNQeVyfDlMGzMtTTlyVIQqyMvIIz8zP635MMaYePUGBRGJ9jscBbwRt6xVXDs5ZcgUZp4807lLGKFXQS/+eMwfmbDfhLTlSVUJhoMU5RdZ57IxpkWpr2KfDbwlIt/jXG30DoCI7A1sT3HemsyUIVOYMmQKm0o3URYsI9uXndb8lAXK6JLTxZ6mZoxpceoMCqo6XUReB3oC/1FVdRd5gMtTnbm2KBQJ4fP46JxrncvGmJan3iYgVf0gybz/pSY7bZ8/4KdvYV97mpoxpkWymqkZlQfLKcgqIC8zL91ZMcaYpCwoNJOIRghFQnTP657urBhjTK0sKDQTf9BvT1MzxrR4KQ0KIjJORFaLyFoRqfXGABE5TUTUHVOpzQmEA/g8PgqzC9OdFWOMqVPKgoL7zIX7gOOBgcBkERmYJF0BzsN7PkxVXtKtIlRBz/ye1rlsjGnxUllLjQLWqurnqhoA5gCnJkn3O+CPQEUK85I2/qCfwqxCe5qaMaZVSOVdyb2Br+Om1wMHxScQkQOAvqr6goj8srYNichUYCpAUVERJSUljcpQKBIiopFmvYs4EomQ5ctiNavrTFdaWtro79VeWBnVzcqnblY+DZPKoJCs5tXYQhEPcBdwXn0bUtWZuAPwjRgxQseOHduoDDX3Hc07K3fSI79Hg/oSSkpKaOz3ai+sjOpm5VM3K5+GSWXz0Xqgb9x0HyB+vOoCYDBQIiJfAqOB59tKZ3NlqJIsbxYdsjqkOyvGGNNgqQwKC4EBIrKHiGQCZwDPRxeq6nZV7aqqxapaDHwAnKKqi1KYp2ahqlSGKulR0MMGvDPGtCopCwqqGgIuA14BPgGeVtWVInKLiJySqv22BOXBcjrndk77wHvGGLOrUjr8taq+CLyYMO/GWtKOTWVemks4EgagS06XNOfEGGN2nV0438TKAmV0z+tuT1MzxrRKFhSaUEWogrzMPAqyCtKdFWOMaRQLCk1EVQmEA3TP626dy8aYVsuCQhPxB/10zelKli8r3VkxxphGs6DQBEKREB7x0CmnU7qzYowxu8WCQhPwB/0U5RVZ57IxptWzoLCbyoPlFGQWkJ+Vn+6sGGPMbrOgsBsiGiGsYbrldUt3VowxpklYUNgN/qCfrrldyfRmpjsrxhjTJCwoNFIwHMQnPjpmd0x3VowxpslYUGik8mA5PQp62NPUjDFtitVojVAeLKcwu5DcjNx0Z8UYY5qUBYVdFNEI4UiYrrld050VY4xpchYUdlFZoIzu+d3J8GakOyvGGNPkLCjsgkA4QJY3i8Ks+h+vaYwxrZEFhQZSVSqCFRTlF9mAd8aYNsuCQgOVB8vplNOJnIycdGfFGGNSxoJCA4QjYRSlS649Tc0Y07ZZUGiA6IB3Pk9Kn15qjDFpZ0GhHpWhSrJ92fY0NWNMu2BBoQ7Rp6n1yO9hncvGmHbBgkId/EE/nXM629PUjDHthgWFWoQiIQShc07ndGfFGGOajQWFWviDfory7Wlqxpj2xYJCEhWhCvIy8sjPtKepGWPaFwsKCVSVYDhody4bY9olCwoJygJl9jQ1Y0y7ZUEhTjAcxOfx0SmnU7qzYowxaWFBIU55sJyi/CJ7mpoxpt2y2s9VHiynIKuAvMy8dGfFGGPSxoICztPUQpEQ3fO6pzsrxhiTVhYUcO5J6J5nT1Mzxph2HxQC4QA+j4/CbHuamjHGtPugUBGqoGd+T+tcNsYYUhwURGSciKwWkbUiMi3J8qtEZJWILBOR10Wkfyrzk8gf9NMxq6M9Tc0YY1wpCwoi4gXuA44HBgKTRWRgQrKPgRGqOhSYC/wxVflJFI6EUVW65nVtrl0aY0yLl8ozhVHAWlX9XFUDwBzg1PgEqvqmqvrdyQ+APinMTzXRzmV7mpoxxlRJZY3YG/g6bno9cFAd6c8HXkq2QESmAlMBioqKKCkpaVSGQpEQEY3Epjd6NzZqO6lQWlra6O/VXlgZ1c3Kp25WPg2TyqCQbDQ5TZpQ5CxgBHB4suWqOhOYCTBixAgdO3ZsozK0qXQTZcEyAqEAxZ2KyfZlN2o7qVBSUkJjv1d7YWVUNyufuln5NEwqg8J6oG/cdB9gQ2IiETkauAE4XFUrU5gfoKrZqCUFBGOMaSlS2aewEBggInuISCZwBvB8fAIROQB4EDhFVTenMC8xWd4suuR0aY5dGWNMq5OyoKCqIeAy4BXgE+BpVV0pIreIyClusjuAfOAZEVkiIs/Xsrkm4REPRXn2NDVjjKlNSi+9UdUXgRcT5t0Y9/nopthPMBhk/fr1VFRU1J0fFEH4hm+aYrdNqrCwkE8++STd2WjRUl1G2dnZ9OnTh4wMG+7EtF9t4nrM9evXU1BQQHFxcat9WtrOnTspKChIdzZatFSWkaqyZcsW1q9fzx577JGSfRjTGrSJsR0qKiro0qVLqw0IJv1EhC5dutR7tmlMW9cmggJgAcHsNvs3ZEwbCgrGGGN2X/sMCrNmQXExeDzO+6xZu7W5LVu2sP/++7P//vvTo0cPevfuHZsOBAIN2sYll1zC6tWr60xz3333MWs382qMMXVpEx3Nu2TWLJg6FfzukEvr1jnTAFOmNGqTXbp0YcmSJQDcfPPN5Ofn88tf/rJaGlVFVfF4ksfh+++/v95O1EsvvbRR+Uu1+r6bMab1aHt/xVdcAWPH1v46//yqgBDl9zvza1vniisalZW1a9cyePBgLr74YoYPH87GjRuZOnUqI0aMYNCgQdxyyy2xtMceeyxLliwhFArRsWNHpk2bxrBhwzj44IPZvNm5r+/Xv/41M2bMAGDMmDFMmzaNUaNGse+++/Lee+8BUFZWxsSJExk2bBiTJ09mxIgRsYAV75prrmHgwIEMHTqUa6+9FoBvv/2WU089laFDhzJs2DA+/PBDAP74xz8yePBgBg8ezF/+8pdav9tLL73EwQcfzPDhw5k0aRJlZWWNKjdjTPq0vaBQn8paRtKobf5uWrVqFeeffz4ff/wxvXv35rbbbmPRokUsXbqUV199lVWrVtVYZ/v27Rx++OEsXbqUgw8+mEcffTTptlWVBQsWcMcdd8QCzF/+8hd69OjB0qVLmTZtGh9//HGN9TZt2sSLL77IypUrWbZsGddddx3gnIkcc8wxLFu2jMWLF7PffvuxYMECZs2axYIFC3j//ff561//yrJly2p8t4yMDG677TZef/11PvroI4YOHcrdd9/dVMVojGkmba/5yD2SrlVxsdNklKh/f0jBCIp77bUXI0eOjE3Pnj2bRx55hFAoxIYNG1i1ahUDB1Z/zEROTg7HH388AAceeCDvvPNO0m1PmDAhlubLL78E4N13340d+Q8bNoxBgwbVWK9z5854PB4uvPBCTjzxRE466STAGTBszpw5APh8Pjp06MA777zDxIkTyc3NBeAnP/kJ7777Lscee2y17/bee++xatUqDjnkEAACgQBjxozZ9QIzxqRV2wsK9Zk+vXqfAkBurjM/BfLy8mKf16xZw913382CBQvo2LEjZ511VtLr4jMzM2OfvV4voVAo6bazsrJqpFFNOhBtNRkZGSxatIhXX32VOXPmcP/99/Of//wHqHlZZl3bi/9uqsq4ceN48skn692/Mablan/NR1OmwMyZzpmBiPM+c2ajO5l3xY4dOygoKKBDhw5s3LiRV155pcn3MWbMGJ5++mkAli9fnrR5aufOnezYsYOTTjqJu+66K9bEdMQRR/DAAw8AEA6H2bFjB4cddhjz58+nvLyc0tJS/vnPf3LooYfW2OYhhxzCW2+9xeeffw44fRtr1qxp8u9njEmt9nemAE4AaIYgkGj48OEMHDiQwYMHs+eee/LjH/+4yfdx+eWXc8455zB06FCGDx/O4MGDKSwsrJZm+/btTJgwgcrKSiKRCHfeeScA9957LxdeeCEPPvggPp+PBx98kFGjRjF58uRYM9Ell1zCkCFDWLt2bbVtFhUV8cgjjzBp0qTYZbi///3vGTBgQJN/R2NM6khDmhtakhEjRuiiRYuqzfvkk0/Yb7/90pSjptFU4/qEQiFCoRDZ2dmsWbOGY489ljVr1uDztf743xzjQ7Xmf0v2EJm6tffyEZHFqjqivnStv6Yw1ZSWlnLUUUcRCoVQ1dhRvzHGNITVFm1Mx44dWbx4cbqzYYxppdpfR7MxxphaWVAwxhgTY0HBGGNMjAUFY4wxMe0yKMxaPoviGcV4fuuheEYxs5bv/nDU3377LWeccQZ77bUXAwcO5IQTTuB///tfE+S26RUXF/P9998DxIalSHTeeecxd+7cOrfz+OOPs2HDhtj0BRdckPRmOWNM69Hurj6atXwWU/81FX/QGeZi3fZ1TP2XM3T2lCGNu6FNVRk/fjznnntubOygJUuWsGnTJvbZZ59YunA4jNfr3c1v0LSio6s2xuOPP87gwYPp1asXAA8//HBTZatJhUIhuyzXmAZqc2cKV7x8BWMfH1vr6/x/nh8LCFH+oJ/z/3l+retc8XLdQ2e/+eabZGRkcPHFF8fm7b///hx66KGUlJRwxBFHcOaZZzJkyBAA7rzzzthQ1NGhsMvKyjjxxBMZNmwYgwcP5qmnngJg2rRpsSGuE5/RAM5zGH71q1/Fph9//HEuv/xywBm87sADD2TQoEHMnDkzad7z8/MBJ7BddtllDBw4kBNPPDE2XDfALbfcwsiRIxk8eDBTp05FVZk7dy6LFi1iypQp7L///pSXlzN27FiiNxbOnj2bIUOGMHjw4NgAfdH93XDDDQwbNozRo0ezadOmGnl66623Yg8pOuCAA9i5cycAM2bMYMiQIQwbNoxp06YBTvAdPXo0Q4cOZfz48WzduhWAsWPHcv3113P44Ydz991389133zFx4kRGjhzJyJEj+e9//1v7D2pMO9bmgkJ9KsPJh8iubX5DrFixggMPPLDW5QsWLGD69OmsWrWKxYsX89hjj/Hhhx/ywQcf8NBDD/Hxxx/z2muv0atXL5YuXcqKFSsYN24cP/zwA/Pnz48Ncf3rX/+6xrZPO+005s2bF5t+6qmnmDRpEgCPPvooixcvZtGiRdxzzz1s2bKl1jzOnz+f1atXs3z5ch566KFqZxCXXXYZCxcuZMWKFZSXl/PCCy9w2mmnMWLECGbNmsWSJUvIycmJpd+wYQPXXnstb7zxBkuWLGHhwoU899xzgBP8Ro8ezdKlSznssMN46KGHauTlT3/6E/fddx9LlizhnXfeIScnh5deeokXXniBDz/8kKVLl8YC4TnnnMPtt9/OsmXLGDJkCL/97W9j29m2bRtvvfUWV199Nb/4xS+48sorWbhwIc8++ywXXHBBrWVhTHvW5s6pZ4yre+js4hnFrNtec+js/oX9KTmvJCV5GjVqFHvssQfgDG09fvz42AijEyZM4J133mHMmDH85je/4dprr+Wkk07i0EMPjQ1XccEFF1Qb4jpet27d2HPPPfnggw8YMGAAq1evjo2pdM899zB//nwAvv76a9asWUOXLl2S5vHtt99m8uTJeL1eevXqxZFHHhlb9uabb/LHP/4Rv9/PDz/8wKBBgzj55JNr/b4LFy5k7NixdOvWDYApU6bw9ttv85Of/ITMzMzY9zjwwAN59dVXa6z/4x//mKuuuoopU6YwYcIE+vTpw2uvvcZZZ50VG8K7c+fObN++nW3btnH44YcDcO6553L66afHthMNjgCvvfZatf6OHTt2NMuwGca0Nu3uTGH6UdPJzcitNi83I5fpRzV+6OxBgwbVeRdx4hDTyQwYMIDFixczZMgQrrvuOm655RZ8Ph8LFixg4sSJPPfcc4wbN45wOBxrWrnxxhsBp/J7+umnefbZZxk/fjwiQklJCa+99hrvv/8+S5cu5YADDkg6THe8xGGzASoqKvi///s/5s6dy/Lly7nwwgvr3U5d42llZGTE9lPbsODTpk3j4Ycfpry8nNGjR/Ppp5+iqknzV5f4co9EIrz//vssWbKEJUuW8M0331hAMCaJdhcUpgyZwsyTZ9K/sD+C0L+wPzNPntnoTmaAI488ksrKympNIQsXLuStt96qkfawww7jueeew+/3U1ZWxvz58zn00EPZuHEjubm5nHXWWfzyl7/ko48+orS0lO3bt3PCCScwY8YMlixZgtfrjVVs0aetTZgwgeeee47Zs2fHjo63b99Op06dyM3N5dNPP+WDDz6o8zscdthhzJkz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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "title = \"Learning Curves (LinearRegression)\"\n",
    "cv = cross_validation.ShuffleSplit(X_train.shape[0], n_iter=10,test_size=0.2, random_state=0)\n",
    "estimator = LinearRegression()\n",
    "plot_learning_curve(estimator, title, X, y, (0.0, 1.01), cv=cv, n_jobs=4)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 就各模型的测试性能展开分析：\n",
    "* 三个模型中不带正则的最小二乘模型在训练集和测试集上的训练效果都是最好的\n",
    "* 原因是因为模型没有处于过拟合状态，从r2_score可看出在测试集和训练集上的分数相差很小，而过拟合状态两者的分数应该相差较大。因此正则并未带来性能上的提升"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
